<?php
/** 更改密码时验证旧密码 */
add_action('user.update', function($arg){
	if(!empty($arg['user_password']) && !is_admin()){
		if(!isset($arg['old_password']) || empty($arg['user_id'])) return error(lang('mod.missingArguments'));
		$pwd = mysql::select('user', 'user_password', "`user_id` = {$arg['user_id']}")->fetch_object()->user_password;
		if(!hash_verify($pwd, $arg['old_password'])) return error('原始密码错误。');
	}
});

/** 检查是否开启用户注册 */
add_hook('user.add', function(){
	if(!config('user.register.enable') && !is_admin()) return error('用户注册已关闭。');
});

/** 验证用户注册验证码 */
add_action('user.add', function($input){
	if(in_array(config('user.register.verify'), array('vcode', 'email')) && !is_admin()){
		if(session_status() != PHP_SESSION_ACTIVE) session_start();
		if(!isset($input['vcode']) || strtolower($input['vcode']) != strtolower($_SESSION['vcode'])) {
			return error('验证码错误。');
		}elseif((time() - $_SESSION['time']) > 60*30){
			return error('验证码已过期。');
		}
	}
});

/** 添加用户时检查邮箱是否可用 */
add_action('user.add', function($input){
	if(!empty($input['user_email'])){
		if(cms_get_uid_by_email($input['user_email'])){
			return error('邮箱地址已被另一个用户使用。');
		}
	}
});

/** 更新用户时检查邮箱是否可用 */
add_action('user.update', function($input){
	if(!empty($input['user_email'])){
		$uid = cms_get_uid_by_email($input['user_email']);
		if($uid && $uid != $input['user_id']){
			return error('邮箱地址已被另一个用户使用。');
		}
	}
});

/** 使用邮件发送找回密码链接 */
add_action('user.mailRepass', function($input){
	if(error()) return error();
	if(!empty($input['user_email']) && filter_var($input['user_email'], FILTER_VALIDATE_EMAIL)){
		$uid = cms_get_uid_by_email($input['user_email']);
		if($uid && get_user($uid)){
			if(session_status() != PHP_SESSION_ACTIVE) session_start();
			$recoverId = rand_str(14, '0123456789abcdef');
			$_SESSION['RecoverId'] = $recoverId;
			$_SESSION['user_id'] = user_id();
			$_SESSION['time'] = time();
			$user = user_nickname() ?: user_name();
			$body = '<p>尊敬的 '.$user.', 你刚在我们的网站上进行了找回密码操作，为了完成这个操作，请在 30 分钟内访问下面的链接并在打开的新页面中完成更改密码操作：</p>';
			$link = admin_url().'login.html?action=repass&RecoverId='.base64_encode($recoverId.session_id());
			$body .= '<p><a title="点此访问" href="'.$link.'">'.$link.'</a></p>';
			$body .= '<p>如果这个请求不是你主动发出的，请直接忽略它。</p>';
			mail::to($input['user_email'])
				->subject('[找回密码]'.config('site.name'))
				->send($body);
			return success('验证码已发送到指定邮箱。');
		}else{
			return error('该邮箱没有没有匹配的用户。');
		}
	}else{
		return error('邮件地址格式错误。');
	}
}, false);

add_action('user.recoverPassword', function($input){
	if(error()) return error();
	$recover = config('user.password.recoverEmail');
	if($recover == 'link' || $recover == 'vcode'){
		if(session_status() != PHP_SESSION_ACTIVE) session_start();
		if(empty($input['user_password']) || ($recover == 'link' && empty($input['RecoverId'])) || ($recover == 'vcode' && empty($input['vcode']))) return error(lang('mod.missingArguments'));
		$recoverId = substr(base64_decode($input['RecoverId']), 0, 14);
		if($recover == 'link' && $recoverId !== $_SESSION['RecoverId']) return error('验证参数不匹配。');
		if($recover == 'vcode'){
			if((time() - $_SESSION['time']) > 60*30){
				return error('验证码已过期。');
			}elseif(strtolower($input['vcode']) !== strtolower($_SESSION['vcode'])){
				return error('验证码错误。');
			}
		}
		if(strlen($input['user_password']) < config('user.password.minLength')) return error(lang('user.passwordTooShort'));
		if(strlen($input['user_password']) > config('user.password.maxLength')) return error(lang('user.passwordTooLong'));
		$where = $recover == 'link' ? "`user_id` = {$_SESSION['user_id']}" : "`user_email` = '{$_SESSION['user_email']}'";
		if(mysql::update('user', array('user_password'=>md5_crypt($input['user_password'])), $where)){
			return success('密码修改成功，请使用新密码进行登录。');
		}else{
			return error('密码重置失败。');
		}
	}else{
		return error('密码找回功能已关闭。');
	}
}, false);

/** 通过 Email 获取用户 ID */
function cms_get_uid_by_email($email){
	$result = mysql::select('user', 'user_id', "`user_email` = '{$email}'");
	if($result && $result->num_rows){
		return (int)$result->fetch_object()->user_id;
	}
	return false;
}

/**
 * get_user_avatar() 获取用户头像
 * @param  integer $width 宽度
 * @param  string  $src   头像源地址
 * @return [type]         [description]
 */
function get_user_avatar($width = 64, $src = ''){
	$src = $src ?: user_avatar();
	if(!$src) return '';
	$ext = pathinfo($src, PATHINFO_EXTENSION);
	$_src = $src;
	if(stripos($_src, site_url()) === 0){
		$_src = substr($_src, strlen(site_url()));
	}
	$_src = substr($_src, 0, strripos($_src, '.'));
	if(file_exists(__ROOT__.$_src.'_'.$width.'.'.$ext)){
		return site_url($_src.'_'.$width.'.'.$ext);
	}
	return $src;
}